home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Programming / AllPlaton / Unsorted / AMOSMusicTracker.AMOS / AMOSMusicTracker.amosSourceCode next >
Encoding:
AMOS Source Code  |  1994-01-30  |  21.4 KB  |  943 lines

  1. ' ********************************** 
  2. ' *                                * 
  3. ' *     AMOS Music Tracker V0.2    * 
  4. ' *                                * 
  5. ' *     Written by Chris Hodges    * 
  6. ' *                                * 
  7. ' ********************************** 
  8. '
  9. Set Buffer 50
  10. VER$="V0.2"
  11. Gosub INIT
  12. Ink 0,2
  13. Text 9,135,"64"
  14. Text 73,135,"000"
  15. Text 145,135,"000"
  16. Text 217,135,"000"
  17. Text 289,135,"000"
  18. For A=0 To 6
  19.   Text 73,3+A*11,"000"
  20. Next 
  21. Gosub SAMDATAUPDATE
  22. Gr Writing 0
  23. Ink 1
  24. For A=0 To 14
  25.   If A<10 Then A$="0" Else A$=""
  26.   Text 9,144+A*7,A$+Str$(A)-" "+" ---00000 ---00000 ---00000 ---00000"
  27. Next 
  28. Gr Writing 1
  29. Do 
  30.   Gosub NORM
  31.   BU=0
  32.   If I$<>"" Then Gosub KEYTEST
  33.   If MK Then Gosub CLICKING
  34. Loop 
  35. End 
  36. INIT:
  37.   Def Fn DEZ$(ZAHL,STEL)=String$("0",STEL-Len(Str$(ZAHL))+1)+Str$(ZAHL)-" "
  38.   Def Fn STT$(ST$,STEL)=ST$+String$("_",STEL-Len(ST$))
  39.   Unpack 15 To 0
  40.   Paste Icon 120,0,1
  41.   Paste Icon 120,44,2
  42.   Dim VP(3),VOS(3,5)
  43.   VP(0)=1 : VP(1)=2 : VP(2)=4 : VP(3)=8
  44.   For A=0 To 3
  45.     VOS(A,0)=0 : VOS(A,1)=2 : VOS(A,2)=0
  46.     VOS(A,3)=2 : VOS(A,4)=1 : VOS(A,5)=0
  47.   Next 
  48.   ANAL=1
  49.   VOIC=0 : OCTAVE=0
  50.   INITFONTS
  51.   Gosub MESINIT
  52.   STATUS[1,1,50]
  53.   Gosub FILINIT
  54.   Gosub PADINIT
  55.   Gosub RATINIT
  56.   Gosub SAMINIT
  57.   Gosub KEYINIT
  58.   Gosub BUTINIT
  59.   Gosub PLSTINIT
  60.   Limit Mouse 
  61.   Ink 0,2
  62.   Text 9,135,"--  PAT.---  PAT.---  PAT.---  PAT.---"
  63.   PAG=3
  64. Return 
  65. MESINIT:
  66.   Restore MESSAGES
  67.   Read MESS
  68.   Dim MES$(MESS-1)
  69.   For A=0 To MESS-1
  70.     Read MES$(A)
  71.   Next 
  72. Return 
  73. FILINIT:
  74.   Restore PATHES
  75.   Read PATHES
  76.   Dim PATH$(PATHES-1)
  77.   For A=0 To PATHES-1
  78.     Read PATH$(A)
  79.   Next 
  80. Return 
  81. PADINIT:
  82.   Restore KEYBOARD
  83.   Dim KEYBOARD$(2)
  84.   For A=0 To 1
  85.     Read KEYBOARD$(A)
  86.   Next 
  87.   Restore KEYPAD
  88.   Read KEYBOARD$(2)
  89. Return 
  90. RATINIT:
  91.   Restore NONAMES
  92.   Read NAMES
  93.   Dim NO$(NAMES-1)
  94.   For A=0 To NAMES-1
  95.     Read NO$(A)
  96.   Next 
  97.   Restore REPLAYRATES
  98.   Read RATES
  99.   Dim RT(RATES-1)
  100.   For A=0 To RATES-1
  101.     Read RT(A)
  102.   Next 
  103.   Restore REPLAYFREQ
  104.   Read FREQ
  105.   Dim FQ(FREQ-1)
  106.   For A=0 To FREQ-1
  107.     Read FQ(A)
  108.   Next 
  109. Return 
  110. SAMINIT:
  111.   Dim SAM$(63),SAM(63,5)
  112.   For A=0 To 63
  113.     SAM$(A)="EMPTY"
  114.     SAM(A,0)=0 : SAM(A,1)=0 : SAM(A,2)=0
  115.     SAM(A,3)=2 : SAM(A,4)=0 : SAM(A,5)=0
  116.   Next 
  117.   ACSAM=1
  118. Return 
  119. KEYINIT:
  120.   Restore KEYS
  121.   Read PAGS
  122.   MXKEYS=10
  123.   Dim KY$(MXKEYS,3),KY(PAGS-1,1)
  124.   B=1
  125.   For PAG=0 To PAGS-1
  126.     Read LE
  127.     KY(PAG,0)=B : KY(PAG,1)=B+LE-1
  128.     For A=0 To LE-1
  129.       Read KY$(B,3),KY1,KY2,KY3
  130.       KY$(B,0)=Chr$(KY1)
  131.       KY$(B,1)=Chr$(KY2)
  132.       KY$(B,2)=Chr$(KY3)
  133.       Inc B
  134.     Next 
  135.   Next 
  136. Return 
  137. BUTINIT:
  138.   Restore BUTTONS
  139.   Read PAGS
  140.   MXBUTS=75
  141.   Dim B(MXBUTS,8),BO(PAGS-1,1),B$(MXBUTS)
  142.   B=1
  143.   For PAG=0 To PAGS-1
  144.     Read LE
  145.     BO(PAG,0)=B : BO(PAG,1)=B+LE-1
  146.     For A=0 To LE-1
  147.       Read B(B,0),B(B,1),B(B,2),B(B,3),B(B,4),B$(B),B(B,6),B(B,7),B(B,8)
  148.       Inc B
  149.     Next 
  150.   Next 
  151. Return 
  152. PLSTINIT:
  153.   Dim FIL$(2)
  154.   If Exist(PATH$(1))
  155.     Open In 1,PATH$(1)
  156.       LE=Lof(1)
  157.       Reserve As Work 14,LE
  158.       ST=Start(14)
  159.       Sload 1 To ST,LE
  160.     Close 1
  161.   Else 
  162.     STATUS[2,50,100]
  163.     LE=30 : Reserve As Work 14,LE
  164.     Poke$ Start(14),"No PLST Loaded!"
  165.   End If 
  166.   PLSTS=LE/30 : PLSTOF=0 : ACPLST=PLSTS
  167.   FIL$(0)="  " : FIL$(1)="  " : FIL$(2)="  "
  168.   Reserve As Work 13,PLSTS*2
  169.   For A=0 To PLSTS-1
  170.     Doke Start(13)+A*2,A
  171.   Next 
  172. Return 
  173. QUITOUT:
  174.   Pop 
  175.   Screen Close 0
  176. End 
  177. PLSTSCREEN:
  178.   ANAL=0
  179.   Paste Icon 120,0,3
  180.   Ink 0,2
  181.   Text 129,14,"ST-"+FIL$(0)
  182.   Text 177,14,"ST-"+FIL$(1)
  183.   Text 225,14,"ST-"+FIL$(2)
  184.   Text 233,3, Fn DEZ$(ACPLST,4)
  185.   Gosub PLSTFULLUPDATE
  186.   PAG=5
  187. Return 
  188. PLSTEXIT:
  189.   Paste Icon 120,0,1
  190.   ABOUT=0 : ANAL=1
  191.   Paste Icon 120,44,2
  192.   PAG=3 : Gosub RESTTOGGLES
  193. Return 
  194. PLSTTOP:
  195.   PLSTOF=0 : Gosub PLSTFULLUPDATE
  196. Return 
  197. PLSTUP:
  198.   Ink 1,0
  199.   For A=0 To Min(TIM/100,3)
  200.     If PLSTOF=0 Then Exit 
  201.     Dec PLSTOF
  202.     Def Scroll 1,129,23 To 305,89,0,6
  203.     Scroll 1
  204.     ABPL=PLSTOF : Gosub CREATEPLSTSTR
  205.     Text 129,23,A$
  206.   Next 
  207. Return 
  208. PLSTDOWN:
  209.   Ink 1,0
  210.   For A=0 To Min(TIM/100,3)
  211.     If PLSTOF>ACPLST-13 Then Exit 
  212.     Inc PLSTOF
  213.     Def Scroll 1,129,29 To 305,95,0,-6
  214.     Scroll 1
  215.     ABPL=PLSTOF+11 : Gosub CREATEPLSTSTR
  216.     Text 129,89,A$
  217.   Next 
  218. Return 
  219. PLSTBOTTOM:
  220.   PLSTOF=Max(ACPLST-12,0) : Gosub PLSTFULLUPDATE
  221. Return 
  222. PLSTFULLUPDATE:
  223.   Ink 1,0
  224.   For A=0 To 11
  225.     If A+PLSTOF<ACPLST
  226.       ABPL=A+PLSTOF : Gosub CREATEPLSTSTR
  227.     Else 
  228.       A$=Space$(22)
  229.     End If 
  230.     Text 129,23+A*6,A$
  231.   Next 
  232. Return 
  233. CREATEPLSTSTR:
  234.   BAS=Start(14)+Deek(Start(13)+ABPL*2)*30
  235.   A$=Peek$(BAS+3,18,Chr$(0))
  236.   A$=A$+Space$(18-Len(A$))+Hex$(Deek(BAS+22)*2,4)-"$"
  237. Return 
  238. CLEARFILTERS:
  239.   Ink 0,2
  240.   FIL$(0)="  "
  241.   FIL$(1)="  "
  242.   FIL$(2)="  "
  243.   Text 129,14,"ST-  "
  244.   Text 177,14,"ST-  "
  245.   Text 225,14,"ST-  "
  246.   Text 233,3, Fn DEZ$(PLSTS,4)
  247.   ACPLST=PLSTS
  248.   For A=0 To PLSTS-1
  249.     Doke Start(13)+A*2,A
  250.   Next 
  251.   PLSTOF=0 : Gosub PLSTFULLUPDATE
  252. Return 
  253. FILTER1ENT:
  254.   NUMENT[153,14,2,"  "]
  255.   FIL$(0)=Param$
  256.   Gosub CREATEFILTER
  257. Return 
  258. FILTER2ENT:
  259.   NUMENT[201,14,2,"  "]
  260.   FIL$(1)=Param$
  261.   Gosub CREATEFILTER
  262. Return 
  263. FILTER3ENT:
  264.   NUMENT[249,14,2,"  "]
  265.   FIL$(2)=Param$
  266.   Gosub CREATEFILTER
  267. Return 
  268. FILTERMOUNTED:
  269.   FIL$(0)="  " : FIL$(1)="  " : FIL$(2)="  "
  270.   A$=Dev First$("")
  271.   A=0
  272.   While(A$<>"") and(A<3)
  273.     If Mid$(A$,2,3)="ST-" Then FIL$(A)=Mid$(A$,5,2) : Inc A
  274.     If FIL$(0)="00" Then Dec A : FIL$(0)="  "
  275.     A$=Dev Next$
  276.   Wend 
  277.   Ink 0,2
  278.   Text 129,14,"ST-"+FIL$(0)
  279.   Text 177,14,"ST-"+FIL$(1)
  280.   Text 225,14,"ST-"+FIL$(2)
  281.   Gosub CREATEFILTER
  282. Return 
  283. CREATEFILTER:
  284.   ACPLST=0
  285.   ST=Start(13)
  286.   For A=0 To PLSTS-1
  287.     BAS=Start(14)+A*30
  288.     A$=Peek$(BAS+3,2)
  289.     D=0
  290.     If(A$=FIL$(0)) or(A$=FIL$(1)) or(A$=FIL$(2)) Then D=1
  291.     If FIL$(0)+FIL$(1)+FIL$(2)="      " Then D=1
  292.     If D=1 Then Doke ST+ACPLST*2,A : Inc ACPLST
  293.   Next 
  294.   Text 233,3, Fn DEZ$(ACPLST,4)
  295.   PLSTOF=0 : Gosub PLSTFULLUPDATE
  296. Return 
  297. CREDITS:
  298.   If ABOUT=0
  299.     ABOUT=1 : ANAL=0
  300.     Paste Icon 120,44,4
  301.   Else 
  302.     ABOUT=0 : ANAL=1
  303.     Paste Icon 120,44,2
  304.   End If 
  305. Return 
  306. PLSTCLICKED:
  307.   If ACSAM=0 Then Return 
  308.   Ink 0,2
  309.   ABPL=((YM-23)/6+PLSTOF)
  310.   If ABPL>ACPLST Then Return 
  311.   A=Deek(Start(13)+ABPL*2)
  312.   A$=Peek$(Start(14)+A*30,21,Chr$(0))
  313.   SAM(ACSAM,0)=Deek(Start(14)+A*30+24)
  314.   SAM(ACSAM,1)=Deek(Start(14)+A*30+22)*2
  315.   SAM(ACSAM,2)=Deek(Start(14)+A*30+26)*2
  316.   SAM(ACSAM,3)=Deek(Start(14)+A*30+28)*2
  317.   SAM(ACSAM,4)=SAM(ACSAM,1)
  318.   SAM$(ACSAM)=A$
  319.   Gosub SAMLOAD
  320.   Repeat 
  321.     Gosub NORM
  322.   Until MK=0
  323. Return 
  324. SAMLOAD:
  325.   If ACSAM=0 Then Return 
  326.   F$=SAM$(ACSAM)
  327.   If F$="" Then Return 
  328.   If Exist(F$)=0 Then STATUS[3,100,50] : Return 
  329.   STATUS[4,10,2]
  330.   Gosub DMASTOP
  331.   Erase ACSAM+16
  332.   Reserve As Chip Work ACSAM+16,SAM(ACSAM,4)
  333.   Open In 1,F$
  334.     Sload 1 To Start(ACSAM+16),SAM(ACSAM,4)
  335.   Close 1
  336.   SAM(ACSAM,5)=Start(ACSAM+16)
  337.   Doke SAM(ACSAM,5),0
  338.   Gosub SAMDATAUPDATE
  339. Return 
  340. SAMNUMUP:
  341.   If ACSAM=63 or TIM<0 Then Return 
  342.   Inc ACSAM
  343.   TIM=-7
  344.   Gosub SAMDATAUPDATE
  345. Return 
  346. SAMNUMDOWN:
  347.   If ACSAM=0 or TIM<0 Then Return 
  348.   Dec ACSAM
  349.   TIM=-7
  350.   Gosub SAMDATAUPDATE
  351. Return 
  352. SAMNUMENT:
  353.   NUMENT[81,80,2,Hex$(ACSAM,2)-"$"]
  354.   ACSAM=Max(Min(Val("$"+Param$),63),0)
  355.   Gosub SAMDATAUPDATE
  356. Return 
  357. SETSAMPLE:
  358.   ACSAM=Instr(KEYBOARD$(2),Chr$(SC))-1
  359.   Gosub SAMDATAUPDATE
  360. Return 
  361. SAMNAMENT:
  362.   If ACSAM=0 Then Return 
  363.   TEX$=SAM$(ACSAM)
  364.   ENTER[174,102,14,21]
  365.   SAM$(ACSAM)=TEX$
  366. Return 
  367. KILSAMPLE:
  368.   If ACSAM=0 or SAM(ACSAM,5)=0 Then Return 
  369.   Erase ACSAM+16
  370.   SAM$(ACSAM)="EMPTY"
  371.   For A=0 To 3
  372.     If VOS(A,5)=SAM(ACSAM,5)
  373.       Doke $DFF096,VP(A)
  374.       VOS(A,0)=0 : VOS(A,1)=2 : VOS(A,2)=0
  375.       VOS(A,3)=2 : VOS(A,4)=1 : VOS(A,5)=0
  376.     End If 
  377.   Next 
  378.   SAM(ACSAM,0)=0 : SAM(ACSAM,1)=0 : SAM(ACSAM,2)=0
  379.   SAM(ACSAM,3)=2 : SAM(ACSAM,4)=0 : SAM(ACSAM,5)=0
  380.   Gosub SAMDATAUPDATE
  381. Return 
  382. VOLUNEUP:
  383.   If ACSAM=0 or SAM(ACSAM,0)=64 or TIM<0 Then Return 
  384.   Inc SAM(ACSAM,0)
  385.   TIM=-7
  386.   Gosub SAMDATAUPDATE
  387. Return 
  388. VOLUNEDOWN:
  389.   If ACSAM=0 or SAM(ACSAM,0)=0 or TIM<0 Then Return 
  390.   Dec SAM(ACSAM,0)
  391.   TIM=-7
  392.   Gosub SAMDATAUPDATE
  393. Return 
  394. VOLUNEENT:
  395.   If ACSAM=0 Then Return 
  396.   NUMENT[81,91,2,Hex$(SAM(ACSAM,0),2)-"$"]
  397.   SAM(ACSAM,0)=Max(Min(Val("$"+Param$),64),0)
  398.   Gosub SAMDATAUPDATE
  399. Return 
  400. SAMLENUP:
  401.   If ACSAM=0 or SAM(ACSAM,1)=SAM(ACSAM,4) Then Return 
  402.   Gosub SKIPVAL
  403.   SAM(ACSAM,1)=Min(SAM(ACSAM,1)+A,SAM(ACSAM,4))
  404.   Gosub SAMDATAUPDATE
  405. Return 
  406. SAMLENDOWN:
  407.   If ACSAM=0 or SAM(ACSAM,1)=0 Then Return 
  408.   Gosub SKIPVAL
  409.   SAM(ACSAM,1)=Max(SAM(ACSAM,1)-A,SAM(ACSAM,2)+SAM(ACSAM,3))
  410.   Gosub SAMDATAUPDATE
  411. Return 
  412. SAMLENENT:
  413.   If ACSAM=0 Then Return 
  414.   NUMENT[65,102,4,Hex$(SAM(ACSAM,1),4)-"$"]
  415.   SAM(ACSAM,1)=Max(Min(Val("$"+Param$),SAM(ACSAM,4)),SAM(ACSAM,2)+SAM(ACSAM,3))
  416.   Gosub SAMDATAUPDATE
  417. Return 
  418. REPPOSUP:
  419.   If ACSAM=0 or SAM(ACSAM,2)+SAM(ACSAM,3)=SAM(ACSAM,1) Then Return 
  420.   Gosub SKIPVAL
  421.   SAM(ACSAM,2)=Min(SAM(ACSAM,2)+A,SAM(ACSAM,1)-SAM(ACSAM,3))
  422.   Gosub SAMDATAUPDATE
  423. Return 
  424. REPPOSDOWN:
  425.   If ACSAM=0 or SAM(ACSAM,2)=0 Then Return 
  426.   Gosub SKIPVAL
  427.   SAM(ACSAM,2)=Max(SAM(ACSAM,2)-A,0)
  428.   Gosub SAMDATAUPDATE
  429. Return 
  430. REPPOSENT:
  431.   If ACSAM=0 Then Return 
  432.   NUMENT[65,113,4,Hex$(SAM(ACSAM,2),4)-"$"]
  433.   SAM(ACSAM,2)=Max(Min(Val("$"+Param$),SAM(ACSAM,1)-SAM(ACSAM,3)),0)
  434.   Gosub SAMDATAUPDATE
  435. Return 
  436. REPLENUP:
  437.   If ACSAM=0 or SAM(ACSAM,2)+SAM(ACSAM,3)=SAM(ACSAM,1) Then Return 
  438.   Gosub SKIPVAL
  439.   SAM(ACSAM,3)=Min(SAM(ACSAM,3)+A,SAM(ACSAM,1)-SAM(ACSAM,2))
  440.   Gosub SAMDATAUPDATE
  441. Return 
  442. REPLENDOWN:
  443.   If ACSAM=0 or SAM(ACSAM,3)=2 Then Return 
  444.   Gosub SKIPVAL
  445.   SAM(ACSAM,3)=Max(SAM(ACSAM,3)-A,2)
  446.   Gosub SAMDATAUPDATE
  447. Return 
  448. REPLENENT:
  449.   If ACSAM=0 Then Return 
  450.   NUMENT[65,124,4,Hex$(SAM(ACSAM,3),4)-"$"]
  451.   SAM(ACSAM,3)=Max(Min(Val("$"+Param$),SAM(ACSAM,1)-SAM(ACSAM,2)),2)
  452.   Gosub SAMDATAUPDATE
  453. Return 
  454. SKIPVAL:
  455.   A=2 : TIM=-4
  456.   If MK=2 Then A=$10 : TIM=-3
  457.   If MK=3 Then A=$100 : TIM=-2
  458. Return 
  459. SAMDATAUPDATE:
  460.   Ink 0,2
  461.   Text 65,80,Hex$(ACSAM,4)-"$"
  462.   If ACSAM=0 Then Return 
  463.   For A=1 To 4
  464.     Text 65,80+A*11,Hex$(SAM(ACSAM,A-1),4)-"$"
  465.   Next 
  466.   Text 174,102,Left$(SAM$(ACSAM),14)+String$("_",14-Min(Len(SAM$(ACSAM)),14))
  467. Return 
  468. SELOCT1:
  469.   OCTAVE=0
  470. Return 
  471. SELOCT2:
  472.   OCTAVE=1
  473. Return 
  474. NEXVOICE:
  475.   Add VOIC,1,0 To 3
  476. Return 
  477. PREVOICE:
  478.   Add VOIC,-1,0 To 3
  479. Return 
  480. PLAZKEY:
  481.   If(SAM(ACSAM,1)=0 and ACSAM>0) or(VOS(VOIC,0)=0 and ACSAM=0) or VOS(VOIC,4)=0
  482.     Doke $DFF096,VP(VOIC)
  483.     Return 
  484.   End If 
  485.   NO=Instr(KEYBOARD$(1),Chr$(SC))
  486.   If NO Then Add NO,12
  487.   Add NO,Instr(KEYBOARD$(0),Chr$(SC))+OCTAVE*12-1
  488.   If NO>35 Then Return 
  489.   Doke $DFF096,VP(VOIC)
  490.   HB=$DFF0A0+VOIC*16
  491.   If ACSAM>0
  492.     Loke HB,SAM(ACSAM,5)
  493.     If SAM(ACSAM,2)>0
  494.       Doke HB+4,SAM(ACSAM,2)/2
  495.     Else 
  496.       Doke HB+4,SAM(ACSAM,1)/2
  497.     End If 
  498.     Doke HB+6,RT(NO)
  499.     Doke HB+8,SAM(ACSAM,0)
  500.     Doke $DFF096,$8000+VP(VOIC)
  501.     Loke HB,SAM(ACSAM,5)+SAM(ACSAM,2)
  502.     Doke HB+4,SAM(ACSAM,3)/2
  503.     VOS(VOIC,0)=SAM(ACSAM,0)
  504.     VOS(VOIC,1)=SAM(ACSAM,1)
  505.     VOS(VOIC,2)=SAM(ACSAM,2)
  506.     VOS(VOIC,3)=SAM(ACSAM,3)
  507.     VOS(VOIC,5)=SAM(ACSAM,5)
  508.   Else 
  509.     Loke HB,VOS(VOIC,5)
  510.     If SAM(ACSAM,2)>0
  511.       Doke HB+4,VOS(VOIC,2)/2
  512.     Else 
  513.       Doke HB+4,VOS(VOIC,1)/2
  514.     End If 
  515.     Doke HB+6,RT(NO)
  516.     Doke HB+8,VOS(VOIC,0)
  517.     Doke $DFF096,$8000+VP(VOIC)
  518.     Loke HB,VOS(VOIC,5)+VOS(VOIC,2)
  519.     Doke HB+4,VOS(VOIC,3)/2
  520.   End If 
  521. Return 
  522. SONGNAMENT:
  523.   TEX$=SONG$
  524.   ENTER[174,113,18,18]
  525.   SONG$=TEX$
  526. Return 
  527. TGGLEVOICE1:
  528.   A=0 : Gosub TGGLEVOICE
  529. Return 
  530. TGGLEVOICE2:
  531.   A=1 : Gosub TGGLEVOICE
  532. Return 
  533. TGGLEVOICE3:
  534.   A=2 : Gosub TGGLEVOICE
  535. Return 
  536. TGGLEVOICE4:
  537.   A=3 : Gosub TGGLEVOICE
  538. Return 
  539. TGGLEVOICE:
  540.   VOS(A,4)=1-VOS(A,4)
  541.   If VOS(A,4)=0
  542.     Doke $DFF096,VP(A)
  543.     VOS(A,0)=0
  544.     VOS(A,1)=2
  545.     VOS(A,2)=0
  546.     VOS(A,3)=2
  547.     VOS(A,5)=0
  548.   End If 
  549. Return 
  550. DMASTOP:
  551.   Doke $DFF096,15
  552. Return 
  553. RESTTOGGLES:
  554.   P=1
  555.   For PP=0 To PAGS-1
  556.     If P and PAG
  557.       For A=BO(PP,0) To BO(PP,1)
  558.         If B(A,4) and 4
  559.           If B(A,5) : PRESS[A] : Else REALISE[A] : End If 
  560.         End If 
  561.       Next 
  562.     End If 
  563.     Add P,P
  564.   Next 
  565. Return 
  566. KEYTEST:
  567.   P=1 : BU=0
  568.   For PP=0 To PAGS-1
  569.     If P and PAG
  570.       For A=KY(PP,0) To KY(PP,1)
  571.         If Asc(KY$(A,0))=SC and(Asc(KY$(A,1))=KS or(KS and Asc(KY$(A,2))))
  572.           BU=A : Exit 
  573.         End If 
  574.       Next 
  575.     End If 
  576.     Add P,P
  577.   Next 
  578.   If BU<>0 Then Trap Gosub KY$(BU,3) : Return 
  579.   P=1 : BU=0
  580.   For PP=0 To PAGS-1
  581.     If P and PAG
  582.       For A=BO(PP,0) To BO(PP,1)
  583.         If B(A,6)=SC and(B(A,7)=KS or(KS and B(A,8)))
  584.           BU=A : Exit 
  585.         End If 
  586.       Next 
  587.     End If 
  588.     Add P,P
  589.   Next 
  590.   If BU=0 Then Return 
  591.   AR=B(BU,4)
  592.   If AR=0
  593.     Repeat 
  594.       Gosub NORM
  595.     Until SC<>B(BU,6)
  596.     Trap Gosub B$(BU)
  597.     Return 
  598.   End If 
  599.   If AR and 1
  600.     TIM=0
  601.     Repeat 
  602.       Gosub NORM
  603.       Inc TIM
  604.       Trap Gosub B$(BU)
  605.     Until SC<>B(BU,6)
  606.     Return 
  607.   End If 
  608.   If AR and 4
  609.     INVERSE[BU]
  610.     B(BU,5)=1-B(BU,5)
  611.   End If 
  612.   Trap Gosub B$(BU)
  613. Return 
  614. CLICKING:
  615.   P=1 : BU=0
  616.   For PP=0 To PAGS-1
  617.     If P and PAG
  618.       For A=BO(PP,0) To BO(PP,1)
  619.         If XM=>B(A,0) and XM<=B(A,2) and YM=>B(A,1) and YM<=B(A,3)
  620.           BU=A : Exit 
  621.         End If 
  622.       Next 
  623.     End If 
  624.     Add P,P
  625.   Next 
  626.   If BU=0 Then Return 
  627.   AR=B(BU,4)
  628.   If AR=0
  629.     Repeat 
  630.       Gosub NORM
  631.     Until MK=0
  632.     Trap Gosub B$(BU)
  633.     Return 
  634.   End If 
  635.   PB=0
  636.   Repeat 
  637.     PO=PB
  638.     If XM=>B(BU,0) and XM<=B(BU,2) and YM=>B(BU,1) and YM<=B(BU,3) Then PB=1 Else PB=0
  639.     If PB=1 and PO=0
  640.       If AR and 4
  641.         INVERSE[BU]
  642.         B(BU,5)=1-B(BU,5)
  643.       Else 
  644.         PRESS[BU]
  645.       End If 
  646.       TIM=0
  647.     End If 
  648.     If PB=0 and PO=1
  649.       If AR and 4
  650.         INVERSE[BU]
  651.         B(BU,5)=1-B(BU,5)
  652.       Else 
  653.         REALISE[BU]
  654.       End If 
  655.     End If 
  656.     If PB=1 Then Add TIM,MK
  657.     If AR and 1 Then Trap Gosub B$(BU)
  658.     Gosub NORM
  659.   Until MK=0
  660.   BUST=PB
  661.   If PB=0 Then BU=0 : Return 
  662.   If(AR and 4)=0 Then REALISE[BU]
  663.   If AR and 2 Then Trap Gosub B$(BU)
  664. Return 
  665. NORM:
  666.   Multi Wait 
  667.   XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) : MK=Mouse Key
  668.   I$=Inkey$ : SC=Scancode : KS=Key Shift
  669.   If Instr(KEYBOARD$(0)+KEYBOARD$(1),Chr$(SC))>0 Then Gosub PLAZKEY
  670.   If Instr(KEYBOARD$(2),Chr$(SC))>0 Then Gosub SETSAMPLE
  671.   STTIM=Max(STTIM-1,0)
  672.   If STTIM=1 Then STPRI=0 : STATUS[0,0,0]
  673. Return 
  674. ' 0=do not tick, do action immediatly
  675. ' 1=Keep pressed and do action until realised
  676. ' 2=Click box until realised then do action  
  677. ' 4=Tick/Untick button and do action 
  678. PATHES:
  679. Data 4
  680. Data "ST-00:"
  681. Data "ST-00:PLST"
  682. Data "ST-00:Modules/"
  683. Data "AMT."
  684.  
  685. MESSAGES:
  686. Data 5
  687. Data "All right"
  688. Data "AMOS Music Tracker "+VER$
  689. Data "Couldn't load PLST!"
  690. Data "Sample not found!"
  691. Data "Loading Sample..."
  692.  
  693. KEYS:
  694. Data 3
  695.  
  696. ' Permanent Keys 
  697. Data 6
  698. Data "DmaStop",48,0,0
  699. Data "SelOct1",80,0,0
  700. Data "SelOct2",81,0,0
  701. Data "NexVoice",66,0,0
  702. Data "PreVoice",66,1,3
  703. Data "KilSample",60,0,0
  704.  
  705. ' Main Keys
  706. Data 1
  707. Data "Dummy",0,0,0
  708.  
  709. ' PLST Keys
  710. Data 1
  711. Data "Dummy",0,0,0
  712.  
  713. KEYPAD:
  714. Data Chr$(15)+"Z[\]=>?J-./^"+Chr$(29)+Chr$(30)+Chr$(31)+"C"
  715.  
  716. KEYBOARD:
  717. Data '1!2"34$5%6&78(9):'
  718. Data Chr$(16)+Chr$(2)+Chr$(17)+Chr$(3)+Chr$(18)+Chr$(19)+Chr$(5)+Chr$(20)+Chr$(6)+Chr$(21)+Chr$(7)+Chr$(22)+Chr$(23)+Chr$(9)+Chr$(24)+Chr$(10)+Chr$(25)+Chr$(26)+Chr$(12)+Chr$(27)
  719.  
  720. NONAMES:
  721. Data 38
  722. Data "---"
  723. Data "C-1","C#1","D-1","D#1","E-1","F-1","F#1","G-1","G#1","A-1","A#1","B-1"
  724. Data "C-2","C#2","D-2","D#2","E-2","F-2","F#2","G-2","G#2","A-2","A#2","B-2"
  725. Data "C-3","C#3","D-3","D#3","E-3","F-3","F#3","G-3","G#3","A-3","A#3","B-3"
  726. Data "???"
  727.  
  728. REPLAYRATES:
  729. Data 36
  730. Data 856,808,762,720,678,640,604,570,538,508,480,453
  731. Data 428,404,381,360,339,320,302,285,269,254,240,226
  732. Data 214,202,190,180,170,160,151,143,135,127,120,113
  733.  
  734. REPLAYFREQ:
  735. Data 36
  736. Data 4181,4430,4697,4971,5279,5593,5926,6279,6653,7046,7457,7901
  737. Data 8363,8860,9395,9943,10559,11186,11852,12559,13306,14092,14914,15838
  738. Data 16726,17720,18839,19886,21056,22372,23705,25031,26515,28185,29829,31677
  739.  
  740. BUTTONS:
  741. Data 3
  742. ' Permanent Buttons
  743. Data 47
  744.  
  745. ' Exit Button
  746. Data 0,0,0,0,0,"QuitOut",69,0,$FF
  747.  
  748. ' Music    
  749. Data 70,0,97,10,0,"MusikNumEnt",0,0,0
  750. Data 98,0,108,10,1,"MusikNumUp",0,0,0
  751. Data 109,0,119,10,1,"MusikNumDown",0,0,0
  752.  
  753. ' Length 
  754. Data 70,11,97,21,0,"MusLenEnt",0,0,0
  755. Data 98,11,108,21,1,"MusLenUp",0,0,0
  756. Data 109,11,119,21,1,"MusLen",0,0,0
  757.  
  758. ' Pos
  759. Data 48,22,58,32,2,"InsPos",0,0,0
  760. Data 59,22,69,32,2,"DelPos",0,0,0
  761. Data 70,22,97,32,0,"PosEnt",0,0,0
  762. Data 98,22,108,32,1,"PosUp",78,1,3
  763. Data 109,22,119,32,1,"PosDown",79,1,3
  764.  
  765. ' Pattern 1
  766. Data 70,33,97,43,0,"Pat1Ent",0,0,0
  767. Data 98,33,108,43,1,"Pat1Up",0,0,0
  768. Data 109,33,119,43,1,"Pat1Down",0,0,0
  769.  
  770. ' Pattern 2
  771. Data 70,44,97,54,0,"Pat2Ent",0,0,0
  772. Data 98,44,108,54,1,"Pat2Up",0,0,0
  773. Data 109,44,119,54,1,"Pat2Down",0,0,0
  774.  
  775. ' Pattern 3
  776. Data 70,55,97,65,0,"Pat3Ent",0,0,0
  777. Data 98,55,108,65,1,"Pat3Up",0,0,0
  778. Data 109,55,119,65,1,"Pat3Down",0,0,0
  779.  
  780. ' Pattern 4
  781. Data 70,66,97,76,0,"Pat4Ent",0,0,0
  782. Data 98,66,108,76,1,"Pat4Up",0,0,0
  783. Data 109,66,119,76,1,"Pat4Down",0,0,0
  784.  
  785. ' Sample 
  786. Data 62,77,97,87,0,"SamNumEnt",0,0,0
  787. Data 98,77,108,87,1,"SamNumUp",78,8,8
  788. Data 109,77,119,87,1,"SamNumDown",79,8,8
  789.  
  790. ' Volume 
  791. Data 62,88,97,98,0,"VoluneEnt",0,0,0
  792. Data 98,88,108,98,1,"VoluneUp",0,0,0
  793. Data 109,88,119,98,1,"VoluneDown",0,0,0
  794.  
  795. ' Length 
  796. Data 62,99,97,109,0,"SamLenEnt",0,0,0
  797. Data 98,99,108,109,1,"SamLenUp",0,0,0
  798. Data 109,99,119,109,1,"SamLenDown",0,0,0
  799.  
  800. ' Repeat 
  801. Data 62,110,97,120,0,"RepPosEnt",0,0,0
  802. Data 98,110,108,120,1,"RepPosUp",0,0,0
  803. Data 109,110,119,120,1,"RepPosDown",0,0,0
  804.  
  805. ' RepLen 
  806. Data 62,121,97,131,0,"RepLenEnt",0,0,0
  807. Data 98,121,108,131,1,"RepLenUp",0,0,0
  808. Data 109,121,119,131,1,"RepLenDown",0,0,0
  809.  
  810. ' Patternlength/PatV1/PatV2/PatV3/PatV4
  811. Data 7,133,25,141,0,"PatLenEnt",0,0,0
  812. Data 71,133,97,141,0,"ActPat1Ent",0,0,0
  813. Data 143,133,169,141,0,"ActPat2Ent",0,0,0
  814. Data 215,133,241,141,0,"ActPat3Ent",0,0,0
  815. Data 287,133,313,141,0,"ActPat4Ent",0,0,0
  816.  
  817. ' Samplename/Load/Songname 
  818. Data 120,99,286,109,0,"SamNamEnt",0,0,0
  819. Data 287,99,319,109,2,"SamLoad",0,0,0
  820. Data 120,110,319,120,0,"SongNamEnt",0,0,0
  821.  
  822. ' Main Buttons 
  823. Data 16
  824. ' Play/Pattern/Edit
  825.  
  826. Data 120,0,181,10,2,"PlazMusic",68,0,0
  827. Data 120,11,181,21,2,"PlazPat",0,0,0
  828. Data 120,22,181,32,2,"EdMode",64,0,$FF
  829.  
  830. ' Stop/Record/Clear
  831. Data 182,0,243,10,2,"HaltMusic",64,0,$FF
  832. Data 182,11,243,21,0,"Record",0,0,0
  833. Data 182,22,243,32,2,"Clear",70,0,0
  834.  
  835. ' Plst/Plst-Ed/Edit Op.
  836. Data 244,0,305,10,2,"PlstScreen",95,0,0
  837. Data 244,11,305,21,0,"PlstEdScreen",95,1,3
  838. Data 244,22,305,32,0,"EdOpScreen",0,0,0
  839.  
  840. ' Load Module/Save Module
  841. Data 120,33,212,43,2,"MusikSave",0,0,0
  842. Data 213,33,305,43,2,"MusikLoad",0,0,0
  843.  
  844. ' Voice 1/2/3/4 toggles/Credits
  845. Data 306,0,319,10,6,"TggleVoice1",1,16,16
  846. Data 306,11,319,21,6,"TggleVoice2",2,16,16
  847. Data 306,22,319,32,6,"TggleVoice3",3,16,16
  848. Data 306,33,319,43,6,"TggleVoice4",4,16,16
  849. Data 306,44,319,54,2,"Credits",0,0,0
  850.  
  851. ' Plst Buttons 
  852. Data 12
  853.  
  854. ' Clear/Exit 
  855. Data 120,0,171,10,2,"ClearFilters",0,0,0
  856. Data 268,0,319,10,2,"PlstExit",95,0,0
  857. Data 120,11,171,21,0,"Filter1Ent",0,0,0
  858. Data 172,11,219,21,0,"Filter2Ent",0,0,0
  859. Data 220,11,267,21,0,"Filter3Ent",0,0,0
  860. Data 268,11,319,21,2,"FilterMounted",0,0,0
  861. Data 308,22,319,32,2,"PlstTop",76,16,16
  862. Data 308,33,319,43,1,"PlstUp",76,0,3
  863. Data 308,44,319,76,2,"PlstExit",95,0,0
  864. Data 308,77,319,87,1,"PlstDown",77,0,3
  865. Data 308,88,319,98,2,"PlstBottom",77,16,16
  866. Data 123,23,304,94,0,"PlstClicked",0,0,0
  867.  
  868. Procedure INITFONTS
  869. '  Get Disc Fonts  
  870. '  A=0 : FONT=0
  871. '  Repeat  
  872. '    Inc A 
  873. '    If Instr(Upper$(Font$(A)),"AMOSMUSIC") Then FONT=A : Exit 
  874. '  Until Font$(A)="" 
  875. '  If FONT=0 Then Print "Error: Font not found!" : Stop  
  876. '  Set Font FONT 
  877.    Extension_19_05B0 "AmosMusic.font",6
  878. End Proc
  879. Procedure STATUS[MESNUM,PRI,TIM]
  880.   Shared MES$(),STPRI,STTIM
  881.   If STPRI>PRI Then Return 
  882.   STTIM=TIM
  883.   STPRI=PRI
  884.   Ink 0,2 : Text 129,124,MES$(MESNUM)+Space$(23-Len(MES$(MESNUM)))
  885. End Proc
  886. Procedure PRESS[BUT]
  887.   Shared B()
  888.   Ink 3 : Draw B(BUT,0),B(BUT,3)-1 To B(BUT,0),B(BUT,1) : Draw To B(BUT,2)-1,B(BUT,1)
  889.   Ink 1 : Draw B(BUT,0)+1,B(BUT,3) To B(BUT,2),B(BUT,3) : Draw To B(BUT,2),B(BUT,1)+1
  890. End Proc
  891. Procedure REALISE[BUT]
  892.   Shared B()
  893.   Ink 1 : Draw B(BUT,0),B(BUT,3)-1 To B(BUT,0),B(BUT,1) : Draw To B(BUT,2)-1,B(BUT,1)
  894.   Ink 3 : Draw B(BUT,0)+1,B(BUT,3) To B(BUT,2),B(BUT,3) : Draw To B(BUT,2),B(BUT,1)+1
  895. End Proc
  896. Procedure INVERSE[BUT]
  897.   Shared B()
  898.   C1=Point(B(BUT,0),B(BUT,1))
  899.   C2=Point(B(BUT,2),B(BUT,3))
  900.   Ink C2 : Draw B(BUT,0),B(BUT,3)-1 To B(BUT,0),B(BUT,1) : Draw To B(BUT,2)-1,B(BUT,1)
  901.   Ink C1 : Draw B(BUT,0)+1,B(BUT,3) To B(BUT,2),B(BUT,3) : Draw To B(BUT,2),B(BUT,1)+1
  902. End Proc
  903. Procedure NUMENT[TX,TY,TL,OLD$]
  904.   TX$="" : Ink 0,2
  905.   UPDAT=1
  906.   Repeat 
  907.     Multi Wait 
  908.     XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) : MK=Mouse Key
  909.     I$=Upper$(Inkey$) : SC=Scancode
  910.     If(I$>="0") and(I$<="9") or(I$>="A") and(I$<="F") Then TX$=TX$+I$ : UPDAT=1
  911.     If I$=Chr$(8) and Len(TX$)>0 Then TX$=Left$(TX$,Len(TX$)-1) : UPDAT=1
  912.     If(I$=Chr$(13)) or(I$=Chr$(27)) or(MK>0) Then TX$=OLD$ : UPDAT=1
  913.     If UPDAT=1 Then Text TX,TY,TX$+String$("-",TL-Len(TX$)) : UPDAT=0
  914.   Until Len(TX$)=TL
  915. End Proc[TX$]
  916. Procedure ENTER[TX,TY,WX,MC]
  917.   Global TEX$
  918.   Ink 0,2
  919.   TEXX=Len(TEX$) : TEXOF=0 : ALT$="x"
  920.   Do 
  921.     Multi Wait : I$=Inkey$ : AC=Asc(I$) : SC=Scancode : KS=Key Shift
  922.     Exit If AC=13 or AC=27 or Mouse Key=1
  923.     If AC>31 and Len(TEX$)<MC Then TEX$=Left$(TEX$,TEXX)+I$+Mid$(TEX$,TEXX+1) : Inc TEXX
  924.     If SC=65 and KS=0 and TEXX>0 Then TEX$=Left$(TEX$,TEXX-1)+Mid$(TEX$,TEXX+1) : Dec TEXX
  925.     If SC=70 and KS=0 and TEXX<Len(TEX$) Then TEX$=Left$(TEX$,TEXX)+Mid$(TEX$,TEXX+2)
  926.     If SC=65 and KS and TEXX>0 Then TEX$=Mid$(TEX$,TEXX+1) : TEXX=0
  927.     If SC=70 and KS and TEXX<Len(TEX$) Then TEX$=Left$(TEX$,TEXX) : TEXX=Len(TEX$)
  928.     If AC=29 and TEXX>0 Then Dec TEXX
  929.     If AC=28 and TEXX<Len(TEX$) Then Inc TEXX
  930.     If SC=79 and KS Then TEXX=0
  931.     If SC=78 and KS Then TEXX=Len(TEX$)
  932.     If TEXX-TEXOF>WX-1 Then TEXOF=TEXX-WX+1
  933.     If TEXX-TEXOF<0 Then TEXOF=Max(0,TEXX)
  934.     If(ALT$<>TEX$) or(ALTOF<>TEXOF) or(ALTXX<>TEXX)
  935.       ALT$=TEX$ : ALTOF=TEXOF : ALTXX=TEXX
  936.       Text TX,TY,Mid$(TEX$,TEXOF+1,Min(Len(TEX$)+TEXOF,WX))+String$("_",Max(0,Min(WX,MC)-Len(TEX$)+TEXOF))
  937.       XX=TX+TEXX*8-TEXOF*8
  938.       If TEXX-TEXOF<MC : Screen Copy 0,XX,TY,XX+7,TY+6 To 0,XX,TY,%110000 : End If 
  939.     End If 
  940.   Loop 
  941.   Text TX,TY,Left$(TEX$,Min(Len(TEX$),WX))+String$("_",Max(0,Min(WX,MC)-Len(TEX$)))
  942.   Wait Vbl 
  943. End Proc